package com.silence.springboot.controller;

import com.mybatisflex.core.paginate.Page;
import com.silence.springboot.common.Result;
import com.silence.springboot.entity.BookBaseEntity;
import com.silence.springboot.service.BookBaseService;
import com.silence.springboot.vo.input.*;
import com.silence.springboot.vo.output.PageBookBaseInfoOutput;
import com.silence.springboot.vo.output.PageBookStatusAdminOutput;
import com.silence.springboot.vo.output.PageBookStatusOutput;
import com.silence.springboot.vo.output.SelectAllOutput;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 图书信息表 控制层。
 *
 * @author mybatis-flex-helper automatic generation
 * @since 1.0
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/book/admin")
@Tag(name = "图书信息", description = "图书信息 控制层")
public class BookBaseController {

    /**
     * 图书信息表 服务层
     */
    private final BookBaseService bookBaseService;

    /**
     * 新建入库
     *
     * @param input 图书信息表实体类
     */
    @PostMapping("/insertBook")
    @Operation(summary = "新建入库", description = "新建入库")
    public Result<T> insertBook(@Validated @RequestBody InsertBookInput input) {
        bookBaseService.insertBook(input);
        // 返回成功
        return Result.success(null);
    }

    /**
     * 查询信息
     *
     * @param input 图书信息表实体类
     */
    @PostMapping("/selectBook")
    @Operation(summary = "查询信息", description = "查询信息")
    public Result<BookBaseEntity> selectBook(@Validated @RequestBody SelectBookInput input) {
        // 返回成功
        return Result.success(bookBaseService.selectBook(input));
    }

    /**
     * 更新信息
     *
     * @param input 图书信息表实体类
     */
    @PostMapping("/updateBook")
    @Operation(summary = "更新信息", description = "更新信息")
    public Result<T> updateBook(@Validated @RequestBody UpdateBookInput input) {
        bookBaseService.updateBook(input);
        // 返回成功
        return Result.success(null);
    }

    /**
     * 分页查询
     *
     * @param input 图书信息表实体类
     */
    @PostMapping("/pageBookBaseInfo")
    @Operation(summary = "分页查询", description = "分页查询")
    public Result<Page<PageBookBaseInfoOutput>> pageBookBaseInfo(@RequestBody PageBookBaseInfoInput input) {
        // 返回成功
        return Result.success(bookBaseService.pageBookBaseInfo(input));
    }

    /**
     * 删除信息
     *
     * @param id 图书信息表主键
     */
    @DeleteMapping("/deleteBook/{id}")
    @Operation(summary = "删除信息", description = "删除信息")
    public Result<Void> deleteBook(@PathVariable("id") String id) {
        bookBaseService.deleteBook(id);
        // 返回成功
        return Result.success(null);
    }

    /**
     * 查询所有信息
     *
     * @return 所有信息
     */
    @GetMapping("/selectAll")
    @Operation(summary = "查询所有信息", description = "查询所有信息")
    public Result<List<SelectAllOutput>> selectAll() {
        // 返回成功
        return Result.success(bookBaseService.selectAll());
    }

    /**
     * 借书
     *
     * @param input 入参
     */
    @PostMapping("/borrowBook")
    @Operation(summary = "借书", description = "借书")
    public Result<Void> borrowBook(@RequestBody BorrowBookInput input) {
        bookBaseService.borrowBook(input);
        // 返回成功
        return Result.success(null);
    }

    /**
     * 还书
     *
     * @param input 入参
     */
    @PostMapping("/returnBook")
    @Operation(summary = "还书", description = "还书")
    public Result<Void> returnBook(@RequestBody ReturnBookInput input) {
        bookBaseService.returnBook(input);
        // 返回成功
        return Result.success(null);
    }

    /**
     * 学生分页查询图书状态
     *
     * @param input 入参
     * @return 分页结果
     */
    @PostMapping("/pageBookStatusStudent")
    @Operation(summary = "学生分页查询图书状态", description = "学生分页查询图书状态")
    public Result<Page<PageBookStatusOutput>> pageBookStatus(@RequestBody PageBookStatusInput input) {
        // 返回成功
        return Result.success(bookBaseService.pageBookStatus(input));
    }

    /**
     * 管理员分页查询图书状态
     *
     * @param input 入参
     * @return 分页结果
     */
    @PostMapping("/pageBookStatusAdmin")
    @Operation(summary = "管理员分页查询图书状态", description = "管理员分页查询图书状态")
    public Result<Page<PageBookStatusAdminOutput>> pageBookStatusAdmin(@RequestBody PageBookStatusAdminInput input) {
        // 返回成功
        return Result.success(bookBaseService.pageBookStatusAdmin(input));
    }

    /**
     * 管理员同意借书或还书
     *
     * @param input 入参
     */
    @PostMapping("/adminAgreeBorrowOrReturn")
    @Operation(summary = "管理员同意借书或还书", description = "管理员同意借书或还书")
    public Result<Void> adminAgreeBorrowOrReturn(@RequestBody AdminAgreeBorrowOrReturnInput input) {
        bookBaseService.adminAgreeBorrowOrReturn(input);
        // 返回成功
        return Result.success(null);
    }

    /**
     * 管理员拒绝借书或还书
     *
     * @param input 入参
     */
    @PostMapping("/adminRefuseBorrowOrReturn")
    @Operation(summary = "管理员拒绝借书或还书", description = "管理员拒绝借书或还书")
    public Result<Void> adminRefuseBorrowOrReturn(@RequestBody AdminRefuseBorrowOrReturnInput input) {
        bookBaseService.adminRefuseBorrowOrReturn(input);
        // 返回成功
        return Result.success(null);
    }
}